package au.com.acpfg.misc.spectra;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.logging.Logger;
import org.knime.core.data.DataCell;
import org.knime.core.data.DataCellDataInput;
import org.knime.core.data.DataCellDataOutput;
import org.knime.core.data.DataCellSerializer;
import org.knime.core.data.DataType;
import org.knime.core.data.DataValue;
import org.knime.core.data.StringValue;
import org.systemsbiology.jrap.stax.Scan;
/**
* A cell which works with mzXML/mzML data as read by the JRAP-stax library
* Callers should use only the AbstractSpectraCell interface as this is supported
* across all file-formats and libraries doing the loading. Code which relies on
* a particular loader or format will break KNIME users.
*
* @author andrew.cassin
*
*/
public class mzMLSpectraCell extends AbstractSpectraCell {
/**
* for serialisation
*/
private static final long serialVersionUID = -8852081501521274502L;
private Scan m_scan; // peak list
private String m_id; // spectrum id required by constructor
private double m_mz_min, m_mz_max;
/**
* Dont invoke this constructor directly: use SpectraUtilityFactory.createCell() instead
*
* @param s
* @param id
*/
public mzMLSpectraCell(Scan s, String id) {
m_scan = s;
m_id = id;
double[] mz = s.getDoubleMassList();
m_mz_min = Double.POSITIVE_INFINITY;
m_mz_max = Double.NEGATIVE_INFINITY;
for (int i=0; i<mz.length; i++) {
if (mz[i] < m_mz_min)
m_mz_min = mz[i];
if (mz[i] > m_mz_max)
m_mz_max = mz[i];
}
}
public static final Class<? extends DataValue> getPreferredValueClass() {
return SpectralDataInterface.class;
}
/*
public static final DataCellSerializer<mzMLSpectraCell> getCellSerializer() {
return new DataCellSerializer() {
@Override
public DataCell deserialize(DataCellDataInput input)
throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public void serialize(DataCell cell, DataCellDataOutput output)
throws IOException {
// TODO Auto-generated method stub
}
};
}*/
@Override
protected boolean equalsDataCell(DataCell dc) {
return (this == dc);
}
@Override
public int hashCode() {
// same as hashcode for the scan instance
return m_scan.hashCode();
}
/*@Override
public String toString() {
return asString(false);
}*/
@Override
public mzMLSpectraCell getMyValue() {
return this;
}
/**
* NB: mz values are round to three decimal places if round is true, no rounding otherwise
*/
public String asString(boolean round) {
StringBuilder sb = new StringBuilder();
double[] mz = getMZ();
double[] intensity = getIntensity();
assert (mz.length == intensity.length);
for (int i=0; i<getNumPeaks(); i++) {
if (round) {
sb.append(Math.round(mz[i] * 1000.0) / 1000.0);
} else {
sb.append(mz[i]);
}
sb.append(' ');
sb.append(intensity[i]);
sb.append('\n');
}
return sb.toString();
}
@Override
public String getID() {
return m_id;
}
@Override
public int getNumPeaks() {
return m_scan.getHeader().getPeaksCount();
}
@Override
public int getMSLevel() {
return m_scan.getHeader().getMsLevel();
}
@Override
public double[] getIntensity() {
return m_scan.getDoubleIntensityList();
}
@Override
public double[] getMZ() {
return m_scan.getDoubleMassList();
}
@Override
public double getMaxMZ() {
return m_mz_max;
}
@Override
public double getMinMZ() {
return m_mz_min;
}
}